<?php

/**
 * Search_SearchController
 * 
 * Модуль поиска из стандартного набора модулей.
 * 
 * @package   Basic
 * @author    Игорь Будасов aka Lord <igor.budasov@gmail.com> 
 * @copyright Игорь Будасов aka Lord <igor.budasov@gmail.com> 
 */
 
class Search_SearchController extends Lord_Controller_Action 
{  
    
/*------------------------------------------------------------------------------*/
         
    /**
     * Индексный метод.
     * Показывает формочку аплоада прайса и обрабатывает ее
     */
     
    public function indexAction()
    {
        // показываем форму
        $form = $this->_form();
        $this->view->assign('form', $form);  
    }

/*------------------------------------------------------------------------------*/
         
    /**
     * Метод для отображения результатов поиска
     */
     
    public function resultsAction()
    {
        $this->_process(); 
    }

/*------------------------------------------------------------------------------*/
         
    /**
     * Метод, который обходит указаные модули, 
     * парсит их содержимое и складывает отпарсеное
     * в свою таблицу, чтоб потом релевантно выбирать
     */
     
    public function indexingAction()
    {
        // получаем настройки поиска
        $config = $this->_helper->config()->search->toArray();
        //$ok = $this->model->getTableRows('store_goods');
        
        // получаем инфу из всех таблиц, учавствующих в поиске
        $data = array();
        foreach($config as $k=>$v)
        {    
            // обязательно нужно указать поля, которые доставать из таблиц.
            // если не указать - скрипт завершается по таймауту  
            $fields = explode('|', $v['fields']);
            $data[$k] = $this->model->getTableRows($k, $fields)->toArray();
        }
        
        /**
        * У нас уже есть данные из таблиц, учавствующих в поиске
        * Нам нужно их правильно пересортировать, обрезать тэги
        */
        
        $cache = array();
        $i = 0;
        // для каждой таблицы
        foreach($config as $key=>$val)
        {            
            // для каждой извлеченной из таблицы записи
            foreach($data[$key] as $record)
            {
                // извлекаем поля и кладем в массив
                $fields = explode('|', $val['fields']);
                
                $cache[$i]['text'] = '';
                foreach($fields as $field)
                {
                    $cache[$i]['text']   = $cache[$i]['text'] . $record[$field];
                    $cache[$i]['title']  = $record[$val['title']];
                    $cache[$i]['url']    = $val['url'] . $record[$val['id']];
                    $cache[$i]['snipet'] = $cache[$i]['text'];
                    $cache[$i]['uid']    = $record[$val['id']];
                } 
                // небольшая пост-обработка
                $cache[$i]['text']   = strip_tags($cache[$i]['text'] . $record[$field]);
                $cache[$i]['snipet'] = substr($cache[$i]['text'], 0, 500);
                $i = $i+1;
            }
        }

        /**
        * Теперь у нас есть готовый массив с поисковым кэшем, 
        * и мы можем добавить его в базу.
        */

        $count = count($cache);
        if($count > 0)
        {
            $this->model->clearCache();
            
            foreach($cache as $item)
            {
                $this->model->addCacheRecord($item);
            }
        }
        
        $this->view->count = $count;
        return; 
    }

/*==============================================================================*/

    /**
    * Приватный метод для обработки 
    * формы поиска
    * 
    * @param string $action
    * @param array $data
    * @return void
    */

    private function _process()
    {        
        // показываем форму
        $form = $this->_form();
        $this->view->assign('form', $form); 
              
        // валидация
        if (!empty($_POST)) 
        {
            if (!$form->isValid($_POST)) 
            {   
                // показываем сообщение об ошибке
                $this->view->assign('err', 'form_fail');
                // получаем невалидные значения, введенные в форму         
                $values = $form->getUnfilteredValues();
                // получаем ошибки
                $errors = $form->getErrors(); 
                // показываем форму с невалидными данными
                return $this->view->assign('form', $this->_form($errors));
            }
             
            // обрабатываем форму
            if ($this->_request->isPost()) 
            {    
                $values = $form->getValues();

                $result = $this->model->getSearch($values['query'])->toArray();
                
                $this->view->count = count($result);
                $this->view->results = $result;
                return;
            }        
        } 
    }
    
/*------------------------------------------------------------------------------*/
    
    /**
    * Приватный метод для построения формы
    * 
    * @param $errors array
    * @return object
    */
    
    private function _form($errors = array(), $data = array())
    {
        // обратите внимание, форма создается на основе собственного класса. 
        $form = new Lord_Form_Form();
        $form->setAction( '/' . $this->_moduleName .
                          '/' . $this->_controllerName .
                          '/' . 'results'
                         )
             ->setMethod('post');
        
        // кодировка     
        $charset = $this->_helper->config()->common->charset;
        
        // Строка поиска
        $query = new Zend_Form_Element_Text('query', array(
            'required'    => true,
            // 'label'       => $this->view->translate('search_query'),
            //'description' => $this->view->translate('search_query_desc'),
            'maxlength'   => '50',

            'validators'  => array(
                //array('Alnum',        true, array(true)),
                array('StringLength', true, array(0, 50, $charset))
            ),
            'value'       => (!empty($data['query'])) 
                          ? $data['query'] 
                          : $this->view->translate('search_search_form_query')
        ));

		$query->setDecorators(array('ViewHelper'));
        
        $form->addElement($query);  

		$form->removeDecorator('HtmlTag');
		
        // кнопка сабмита    
        $form->addElement('submit', 'search_submit', 
            array('label' => $this->view->translate('search_search_form_submit'),
                  'decorators' => array('ViewHelper')));
        
        // ошибки
        $this->_helper->FormErrors($errors, $form);
        
        return $form;
    }
    
/*------------------------------------------------------------------------------*/

}
